#ifndef GAME_MER_H
#define GAME_MER_H
#include "../entity/scene.h"
#include "../entity/node.h"
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <map>
#include <string>

namespace STG{

    class GameMer{
    public:
        ~GameMer(){};
        // 返回GameMer类的实例
        static GameMer* instance() {
            // 定义一个静态的GameMer类型的变量_instance
            static GameMer _instance;
        return &_instance;
        }
        int run();
        int changeScene(scene* scene);
        void overGame(){ isRunning = false;};

        // 获取渲染器
        SDL_Renderer* getRenderer(){ return renderer;};
        // 获取窗口指针
        SDL_Window* getWindow(){ return window;};
        // 获取宽度
        int getWidth(){ return width;};
        // 获取树的高度
        int getHeight(){ return height;};
        // 返回一个map，其中包含字符串和Mix_Chunk*的映射
        std::map<std::string, Mix_Chunk*> getSoundEffect(){ return soundEffect;};
        // 获取字体
        TTF_Font* getFont(){ return font;};
        TTF_Font* getTitleFont(){ return titleFont;};
        // 获取得分
        int getScore(){ return _score;};
        // 设置得分
        void setScore(int score){ this->_score = score;};
        // 增加得分
        void addScore(int score){ this->_score += score;};
        auto& getLeaderBoard(){ return leaderBoard;};
        //渲染文字函数
        SDL_Point renderTextCenter(const std::string& text, float posY, bool isTitle = false);
        void renderText(const std::string& text, int posX, int posY, bool isLeft = true);
        void insertLeaderBoard(int score, std::string name);
        void saveLeaderBoard();
        void loadLeaderBoard();

    private:
        bool isRunning = true , fullwin = false;
        scene* currentScene = nullptr;
        SDL_Window* window = nullptr;
        SDL_Renderer* renderer = nullptr;
        int width = 600;
        int height = 800;
        int FPS = 60;
        float frameTime = 0; // 每帧的时间
        std::map<std::string, Mix_Chunk*> soundEffect; // 音效
        background nearBackground; // 近景背景
        background farBackground; // 远景背景
        TTF_Font* font = nullptr, *titleFont = nullptr; // 字体
        int _score = 0; // 得分
        std::multimap<int, std::string,std::greater<int>> leaderBoard; // 排行榜

        int handleEvent(SDL_Event* event);
        int update(float deltaTime);
        int updateBackground(float deltaTime);
        int render();
        int renderBackground();
        int init();
        int clean();
        
        // 构造函数，无参数
        GameMer(){};
        // 禁止拷贝构造函数
        GameMer(const GameMer&) = delete;
        // 禁止右值引用的拷贝构造函数
        GameMer(const GameMer&&) = delete;
        // 禁止拷贝赋值操作符
        GameMer& operator=(const GameMer&) = delete;
        
    };
}; // namespace STG

#endif // GAME_MER_H